/*!
* 文件名     app_task.c
* 作者       聚沃科技
* 版本       V1.0
*/

/*
* 版权说明
* 本程序只供学习使用，未经作者许可，不得用于其它任何用途
* GD32F303东方红开发板V1
* 在线购买：   http://juwo.taobao.com
* 技术交流：   http://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* 创建日期:    2023/8/30
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "app_task.h"

#include "app_nor_flash.h"
#include "app_nand_flash.h"
#include "app_eeprom.h"
#include "app_key.h"
#include "app_sdcard.h"

#include <stdio.h>
#include "bsp_led.h"
#include "bsp_uart.h"
#include "bsp_adc.h"
#include "bsp_key.h"
#include "bsp_beep.h"
#include "bsp_spi.h"
#include "bsp_rgb_pwm.h"
#include "bsp_spi_nand.h"
#include "bsp_spi_nor.h"
#include "bsp_eeprom.h"
#include "bsp_lcd.h"

#include "driver_exmc.h"
#include "bsp_lcd.h"

#include "FreeRTOS.h"
#include "task.h"



#define INIT_TASK_PRIO   ( tskIDLE_PRIORITY + 1 )
#define DISPLAY_TASK_PRIO    ( tskIDLE_PRIORITY + 3 )

void test_fail_handle(void)
{
//    printf_log("Fuction test fail,end of test!\r\n"); 
    for(uint8_t i=0;i<6;i++)
    {
        buzzer_set(H1,50);
        vTaskDelay(300);            
        buzzer_set(H1,0);
        vTaskDelay(300);              
    }
}

void bsp_fuction_test(void)
{   
    float power_voltage=0.0f;
    bsp_lcd_clear(WHITE);
    //显示log图片
    bsp_show_log();
    //重新设置新的打印窗口
    bsp_lcd_printf_init(10,100,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_16_8,WHITE,BLUE);
    
    printf_log("* JUWOTEK Dongfang Red GD32F303 EVB\n\r");
    printf_log("* Copyright (C) 2023-2033\n\r\n\r");
    

    vTaskDelay(200);
    printf_log("* BSP Fuciton test...\n\r");
    
    vTaskDelay(200);
    SystemCoreClockUpdate();
    printf_log("* The CPU is now running:%d\n\r",SystemCoreClock);
    
    vTaskDelay(200);
    bsp_Power_detect_ADC_config();    
    power_voltage=(float)bsp_Power_detect_data_get()/4096*3.3f*2;   
    if(power_voltage>6.0f || power_voltage<2.6f)
    {
        printf_log("* The Power voltage error:%.2f V! \r\n", power_voltage);        
        test_fail_handle();       
    }
    else
    {
        printf_log("* The Power voltage is %.2f V \r\n", power_voltage);
    }    
        
    vTaskDelay(200);
    printf_log("* The nor flash test...");        
    if(DRV_SUCCESS!=nor_flash_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
    }        
        
    vTaskDelay(200);    
    printf_log("* The nand flash test...");    
    if(DRV_SUCCESS!=nand_flash_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
    } 
    
    vTaskDelay(200);    
    printf_log("* The eeprom test...");    
    if(DRV_SUCCESS!=eeprom_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
    } 

    printf_log("* The ex_sram test...");    
    if(DRV_SUCCESS!=sdcard_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
        card_info_get();
    }    
    
    printf_log("* The sdcard test...");    
    if(DRV_SUCCESS!=sdcard_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
        card_info_get();
    }     

    vTaskDelay(200);    
    bsp_led_on(&LED0);
    bsp_led_on(&LED1);
    printf_log("* Turn toggle LED...\r\n");
    vTaskDelay(2000); 
    bsp_led_off(&LED0);
    bsp_led_off(&LED1);    
    
    printf_log("* Turn on the buzzer...\r\n");     
    buzzer_set(H1,50);
    buzzer_on(); 
    vTaskDelay(1000); 
    buzzer_set(H1,0);       
    
    bsp_rgb_duty_set(50,0,0);
    printf_log("* Set the RGB to red...\r\n");    
    vTaskDelay(1000); 
      
    bsp_rgb_duty_set(0,50,0);
    printf_log("* Set the RGB to green...\r\n");      
    vTaskDelay(1000); 
    
    bsp_rgb_duty_set(0,0,50);
    printf_log("* Set the rgb to blue...\r\n");            
    vTaskDelay(1000); 
    bsp_rgb_duty_set(50,50,50);       
    
    bsp_Rocker_ADC_config();//摇杆ADC配置
    printf_log("* Please turn the rocker...");       
    if(DRV_SUCCESS!=rocker_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
    }     
    
    printf_log("* Press all key...");         
    if(DRV_SUCCESS!=key_test())
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# ERROR!# ")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# ERROR! #\n\r");
        test_fail_handle();       
    }
    else
    {
        bsp_lcd_pritnf_parameter.x_now=bsp_lcd_pritnf_parameter.x_end-sizeof("# PASS ! #")*(bsp_lcd_pritnf_parameter.size/2);
        printf_log("# PASS ! #\n\r");
    }     
    
    
    
    vTaskDelay(2000);    
}

/*!
    \brief      init task
    \param[in]  pvParameters not used
    \param[out] none
    \retval     none
*/
void init_task(void * pvParameters)
{    
    driver_init();       /* 延时和公共驱动部分初始化 */
    
    bsp_uart_init(&BOARD_UART);      /* 打印串口初始化 */      
    
    bsp_led_group_init();        /* 初始化LED组 */   
    
    bsp_key_group_init();        /* 初始化KEY组 */ 

    //注册按键扫描
    driver_tick_handle[0].tick_value=10;    
    driver_tick_handle[0].tick_task_callback=key_scan_10ms_callhandle;
    
    bsp_lcd_init();                 /* 初始化LCD */
    
    //初始化SPI    
    bsp_spi_init(&BOARD_SPI);      
    
    //初始化SPI NAND         
    bsp_spi_nand_init(); 

    //初始化SPI NOR         
    bsp_spi_nor_init();  

    //初始化EEPROM         
    bsp_eeprom_init_AT24C16();  
   
    //初始化蜂鸣器   
    bsp_beep_init(BEEP_CNT_HZ,L1);
    buzzer_on();
   
    //初始化RGB灯珠
    bsp_rgb_init(120000000,100);
    
//    //初始化OLED
//    bsp_oled_init();    
        
    bsp_fuction_test();   
        
    /* start toogle LED2 task every 500ms */
    xTaskCreate(display_task, "display", configMINIMAL_STACK_SIZE, NULL, DISPLAY_TASK_PRIO, NULL);
    for( ;; ){
        vTaskDelete(NULL);
    }
}

/*!
* 说明     main函数
* 输入     无
* 输出     无
* 返回值   无
*/
void display_task(void * pvParameters)
{    
    uint64_t tick_temp=0;
    uint16_t frames_speed=0;    
    //计算刷整屏速度
    tick_temp=driver_tick;
    bsp_lcd_clear(WHITE);
    frames_speed=driver_tick-tick_temp;
    
    //显示log图片
    bsp_show_log();
    
    //设置打印窗口
    bsp_lcd_printf_init(10,109,bsp_lcd_parameter.width-1,369,FONT_ASCII_24_12,WHITE,BLUE);
    
    //打印到LCD    
    bsp_lcd_printf("GD32F303ZGT6\r\n");
    bsp_lcd_printf("EXMC LCD Brush Test\r\n");
    bsp_lcd_printf("LCD ID:%04X\r\n", bsp_lcd_parameter.id);    
    bsp_lcd_printf("* Suzhou Juwo Electronic\r\n");
    bsp_lcd_printf("* web: www.gd32bbs.com\r\n");
    bsp_lcd_printf("* B station: 475462605\r\n");
    bsp_lcd_printf("* QQ Group: 859440462\r\n");
    bsp_lcd_printf("* Taobao: juwo.taobao.com\r\n");
    bsp_lcd_printf("* Official ID: gd32bbs\r\n");        
    bsp_lcd_printf("frames brush:%d ms\r\n", frames_speed);   

    //重新设置新的打印窗口
    bsp_lcd_printf_init(0,370,bsp_lcd_parameter.width-1,bsp_lcd_parameter.height-1,FONT_ASCII_12_6,BLUE,~BLUE);

    while (1)
    {
        //将摇杆采集结果处理控制LCD亮度
        bsp_lcd_backlight_duty_set(100-(0xfff-Rocker_data[0])*100/0xfff);
        
        //打印亮度信息到LCD
        bsp_lcd_printf("* backlight is %d",100-(0xfff-Rocker_data[0])*100/0xfff); 
        bsp_lcd_printf("      ");
        //打印系统tick到LCD
        bsp_lcd_printf("* system tic is %lld \r\n",driver_tick);    
        vTaskDelay(200); 

        /* 检测任意按键按下时长 */
        if(KEY1.press_timerms >= PRESS_50MS)
        {
            bsp_led_toggle(&LED0);
            bsp_led_toggle(&LED1);            
            KEY1.press_timerms=PRESS_NONE;                
            printf_log("KEY1 press briefly.\r\n");
            bsp_rgb_duty_set(50,0,0);  
        }            
        if(KEY2.press_timerms >= PRESS_50MS)
        {
            bsp_led_toggle(&LED0);
            bsp_led_toggle(&LED1);              
            KEY2.press_timerms=PRESS_NONE;                
            printf_log("KEY2 press briefly.\r\n");
            bsp_rgb_duty_set(0,50,0);
        } 
        if(WKUP_KEY.press_timerms >= PRESS_50MS)
        {
            bsp_led_toggle(&LED0);
            bsp_led_toggle(&LED1);              
            WKUP_KEY.press_timerms=PRESS_NONE;                
            printf_log("WKUP_KEY press briefly.\r\n");
            bsp_rgb_duty_set(0,0,50);
        } 
        if(ROCKER_KEY.press_timerms >= PRESS_50MS)
        {
            bsp_led_toggle(&LED0);
            bsp_led_toggle(&LED1);              
            ROCKER_KEY.press_timerms=PRESS_NONE;                
            printf_log("ROCKER_KEY press briefly.\r\n");
            bsp_rgb_duty_set(50,50,50);  
        }         
        
    }
}

